package org.hzy.dao;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class BaseDao<T> {

	static Configuration config = new Configuration().configure();
	static SessionFactory fac = config.buildSessionFactory();

	private Class entityclass;

	public Session getSession() {
		return fac.getCurrentSession();
	}

	public BaseDao() {
		// TODO Auto-generated constructor stub
		this.entityclass = getParameterizedType(this.getClass());
	}

	protected Class getParameterizedType(Class clazz) {
		// 得到传入进来类的父类型 //BaseDao<Dept>--org.hzy.dao.BaseDao<org.hzy.entity.Dept>
		Type ty = clazz.getGenericSuperclass();//返回表示此 Class 所表示的实体（类、接口、基本类型或 void）的直接超类的 Type。
		// System.out.println(ty);
		
		// 得到当前类型的泛型 <Dept>--class org.hzy.entity.Dept
		Type[] types=null;
		if (ty instanceof ParameterizedType) {
			//注意此处ty必须是有泛型参数 
			types= ((ParameterizedType) ty).getActualTypeArguments();
		}else{  
            try {  
                throw new Exception("not find ParameterizedType!");  
            } catch (Exception e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }
		}
		// System.out.println(types[0]);
		
		// Type t=((ParameterizedType)ty).getRawType();//得到声明这个类型的类或者接口
		return (Class) types[0];
	}

	public T get_object(Integer id) {
		return (T) this.getSession().get(entityclass, id);
	}
}
